﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades.Reclamos;
using System.Data;
using Datos.Reclamos.Common;
using Datos.Reclamos.DAL;

namespace Datos.Reclamos
{
    public class RecIncidenciaDAL : ConexionBD , IRecIncidenciaDAL
    {
        #region ATRIBUTOS       
        
        private SqlCommand cmd;

        #endregion

        #region METODOS PARA LOS CLIENTES

        public List<GenCliente> listarClientes()
        {
            List<GenCliente> lista = new List<GenCliente>();
            GenCliente be;

            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ListarCliente";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();
            
            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        be = new GenCliente();
                        be.IdCliente = dr.GetInt32(dr.GetOrdinal("idCliente"));
                        be.nombre = dr.GetString(dr.GetOrdinal("nombre"));                        
                        lista.Add(be);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return lista;
        }

        #endregion

        #region METODOS PARA LAS AREAS DE TRABAJO

        public List<RecArea> listarAreas()
        {
            List<RecArea> lista = new List<RecArea>();
            RecArea be;

            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ListarArea";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        be = new RecArea();
                        be.IdArea = dr.GetInt32(dr.GetOrdinal("idArea"));
                        be.nomArea = dr.GetString(dr.GetOrdinal("nomArea"));
                        lista.Add(be);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return lista;
        }

        #endregion

        #region METODOS PARA LAS INCIDENCIAS

        public int insertar(RecIncidencia incidencia)
        {
            
            int codInsertado = 0;

            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_InsertarIncidencia";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdArea", SqlDbType.Int, 11).Value = incidencia.IdArea;
            cmd.Parameters.Add("@pIdCliente", SqlDbType.Int, 11).Value = incidencia.IdCliente;
            cmd.Parameters.Add("@pFecIncidencia", SqlDbType.DateTime).Value = incidencia.FecIncidencia;
            cmd.Parameters.Add("@pFecSolucion", SqlDbType.DateTime).Value = incidencia.FecSolucion;
            cmd.Parameters.Add("@pDetalle", SqlDbType.VarChar, 1000).Value = incidencia.Detalle;
            cmd.Parameters.Add("@pAcciones", SqlDbType.VarChar, 1000).Value = incidencia.Acciones;
            cmd.Parameters.Add("@pResponsable", SqlDbType.VarChar, 100).Value = incidencia.Responsable;
            cmd.Parameters.Add("@pContacto", SqlDbType.VarChar, 150).Value = incidencia.Contacto;
            cmd.Parameters.Add("@pEstado", SqlDbType.Int, 1).Value = incidencia.Estado;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        codInsertado = Convert.ToInt32(dr["resultado"]);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
               cmd.Connection.Close();
               cmd.Connection.Dispose();
               cmd.Dispose();              
            }
            return codInsertado;
        }

        public int actualizar(RecIncidencia incidencia)
        {
            int codInsertado = 0;
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ActualizarIncidencia";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdIncidencia", SqlDbType.Int, 11).Value = incidencia.IdIncidencia;
            cmd.Parameters.Add("@pIdArea", SqlDbType.Int, 11).Value = incidencia.IdArea;
            cmd.Parameters.Add("@pIdCliente", SqlDbType.Int, 11).Value = incidencia.IdCliente;
            cmd.Parameters.Add("@pFecIncidencia", SqlDbType.DateTime).Value = incidencia.FecIncidencia;
            cmd.Parameters.Add("@pFecSolucion", SqlDbType.DateTime).Value = incidencia.FecSolucion;
            cmd.Parameters.Add("@pDetalle", SqlDbType.VarChar, 1000).Value = incidencia.Detalle;
            cmd.Parameters.Add("@pAcciones", SqlDbType.VarChar, 1000).Value = incidencia.Acciones;
            cmd.Parameters.Add("@pResponsable", SqlDbType.VarChar, 100).Value = incidencia.Responsable;
            cmd.Parameters.Add("@pContacto", SqlDbType.VarChar, 150).Value = incidencia.Contacto;
            cmd.Parameters.Add("@pEstado", SqlDbType.Int, 1).Value = incidencia.Estado;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        codInsertado = Convert.ToInt32(dr["resultado"]);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose(); 
            }
            return codInsertado;
        }

        public RecIncidencia obtener(int idIncidencia)
        {
            RecIncidencia be = new RecIncidencia();
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ObtenerIncidencia";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdIncidencia", SqlDbType.Int, 11).Value = idIncidencia;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        be = new RecIncidencia();
                        be.IdIncidencia = idIncidencia;
                        be.IdArea = dr.GetInt32(dr.GetOrdinal("idArea"));
                        be.Area = dr.GetString(dr.GetOrdinal("nomArea"));
                        be.IdCliente = dr.GetInt32(dr.GetOrdinal("idCliente"));
                        be.Cliente = dr.GetString(dr.GetOrdinal("nombre"));
                        be.FecIncidencia = dr.GetDateTime(dr.GetOrdinal("fecIncidencia"));
                        be.FecSolucion = dr.GetDateTime(dr.GetOrdinal("fecSolucion"));
                        be.Detalle = dr.GetString(dr.GetOrdinal("detalle"));
                        be.Acciones = dr.GetString(dr.GetOrdinal("acciones"));
                        be.Responsable = dr.GetString(dr.GetOrdinal("responsable"));
                        be.Contacto = dr.GetString(dr.GetOrdinal("contacto"));
                        be.Estado = (dr.GetBoolean(dr.GetOrdinal("estado")))?1:0; 
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose(); 
            }
            return be;
        }

        public List<RecIncidencia> listar(RecIncidencia incidencia)
        {
            List<RecIncidencia> lista = new List<RecIncidencia>();
            RecIncidencia be;
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ListarIncidencia";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pFecInicio", SqlDbType.DateTime).Value = incidencia.FecIncidencia;
            cmd.Parameters.Add("@pFlInicio", SqlDbType.Bit,1).Value = incidencia.flIncidencia;
            cmd.Parameters.Add("@pFecFin", SqlDbType.DateTime).Value = incidencia.FecSolucion;
            cmd.Parameters.Add("@pFlFin", SqlDbType.Bit,1).Value = incidencia.flSolucion;
            cmd.Parameters.Add("@pCodigo", SqlDbType.Int, 11).Value = incidencia.IdIncidencia;
            cmd.Parameters.Add("@pEstado", SqlDbType.Bit, 1).Value = incidencia.Estado;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {                                         
                        be = new RecIncidencia();
                        be.IdIncidencia = dr.GetInt32(dr.GetOrdinal("idIncidencia"));
                        be.IdArea = dr.GetInt32(dr.GetOrdinal("idArea"));
                        be.Area = dr.GetString(dr.GetOrdinal("nomArea"));
                        be.IdCliente = dr.GetInt32(dr.GetOrdinal("idCliente"));
                        be.Cliente = dr.GetString(dr.GetOrdinal("nombre"));
                        be.FecIncidencia = dr.GetDateTime(dr.GetOrdinal("fecIncidencia"));
                        be.FecSolucion = dr.GetDateTime(dr.GetOrdinal("fecSolucion"));
                        be.Detalle = dr.GetString(dr.GetOrdinal("detalle"));
                        be.Acciones = dr.GetString(dr.GetOrdinal("acciones"));
                        be.Responsable = dr.GetString(dr.GetOrdinal("responsable"));
                        be.Contacto = dr.GetString(dr.GetOrdinal("contacto"));
                        be.Estado = (dr.GetBoolean(dr.GetOrdinal("estado")))?1:0;    
                        lista.Add(be);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return lista;
        }

        public int eliminar(int codigo)
        {
            int resultado = 0;
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_EliminarIncidencia";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdIncidencia", SqlDbType.Int, 11).Value = codigo;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        resultado = dr.GetInt32(dr.GetOrdinal("resultado"));
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return resultado;
        }

        #endregion

    }
}